import axios from "axios";
import qs from "qs";
import { message as Message } from "ant-design-vue";
import router from "@/router";
import store from "@/store";
import { getToken } from "./auth";

console.log("在request.ts中")
//  可以放前后端约定的一些返回的状态码
enum InnerCode {
    Success = 200,
    Error = 400,//错误    
    TokenExpired = 401,//身份未认证或已过期，请重新登录
    NotAdmin = 402,//非管理员    
    Forbidden = 404,//未知错误
}

const api = axios.create({
    baseURL: process.env.VUE_APP_BASE_API,
    timeout: 20000,
    headers: {
        "Content-Type": "application/x-www-form-urlencoded"
    }
});

// axios初始化配置
// api.defaults.headers.common["Content-Type"] = "application/x-www-form-urlencoded";
api.defaults.transformRequest = (data) => {
    //var a = {name:’hehe’,age:10}; 
    //qs.stringify序列化结果:name=hehe&age=10(application/x-www-form-urlencoded的参数格式)
    //JSON.stringify序列化结果:"{"a":"hehe","age":10}"
    return data instanceof FormData ? data : qs.stringify(data, { encode: true });
};

//  请求拦截配置
api.interceptors.request.use((config) => {
    console.log(config)

    // 让每个请求携带jwt
    config.headers['authorization'] = getToken()
    
    return config;
});

//  返回状态拦截
api.interceptors.response.use(
    (response) => {
        console.log("response:", response)
        const res = response.data;
        const { code, message } = res;
        if (code === 200) {
            // code 为 0 代表返回正常返回
            // Message.success(message);
            return Promise.resolve(res);
        } else {
            // 出现code相关错误，做相应处理
            switch (code) {
                case InnerCode.TokenExpired:
                    router.push("/login");
                    store.dispatch("logout")
                    break;
                case InnerCode.NotAdmin:
                    router.go(-1);
                    break;
            }
            if (message) {
                Message.error(message);
            }
            return Promise.reject(res);
        }
    },
    (error) => {
        console.error(error.response);
        if (error.toString().indexOf("timeout") !== -1) {
            // 超时
            Message.error("网络请求超时，请检查网络连接！");
        } else if (error.response) {
            switch (error.response.status) {
                // http status handler
                case 400: // 客户端请求有误
                    Message.error("客户端请求有误，请联系管理员！");
                    break;
                case 401: // 未授权
                    Message.error("未授权，请联系管理员！");
                    break;
                case 403: // 禁止访问
                    Message.error("禁止访问！");
                    break;
                case 404: // 找不到
                    Message.error("访问的资源不存在，请稍后重试！");
                    break;
                case 502: // bad gateway
                case 503: // service unavailable
                case 504: // gateway timeout
                    Message.error("服务器维护中，请稍后重试！");
                    break;
                case 500: // 服务器内部错误
                default:
                    Message.error("系统内部错误！");
            }
        }
        return Promise.reject(error.response);
    }
);

export default api